package br.com.foxinline.modelo;

import br.com.foxinline.enums.ComposicaoFamiliar;
import br.com.foxinline.enums.EstadoCivil;
import br.com.foxinline.enums.RendaFamiliar;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.generico.EntidadeGenerica;
import br.com.foxinline.validator.CNPJ;
import br.com.foxinline.validator.CPF;
import java.io.Serializable;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author ely
 */
@Entity
public class Proprietario extends EntidadeGenerica implements Serializable {

    @Id
    @SequenceGenerator(sequenceName = "seq_proprietario", name = "seq_proprietario", allocationSize = 1)
    @GeneratedValue(generator = "seq_proprietario", strategy = GenerationType.SEQUENCE)
    private Long id;
    private String nome;
    @CPF
    private String cpf;
    @CNPJ
    private String cnpj;
    private String nomeFantasia;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNasc;
    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumento;
    private String rg;
    private String orgaoEmissor;
    private String profissao;
    private String localTrabalho;
    @OneToOne(cascade = {CascadeType.ALL})
    private Endereco endereco;
    @Enumerated(EnumType.STRING)
    private EstadoCivil estadoCivil;
    private String telefone;
    @OneToOne
    private Proprietario conjuge;
    private String tempoMoradia;
    private String tempoMoradiaMunicipio;
    private Boolean bolsaFamilia;
    private Double valorBolsaFamilia;
    private Boolean minhaCasaMinhaVida;
    @Enumerated(EnumType.STRING)
    private ComposicaoFamiliar composicaoFamiliar;
    @Enumerated(EnumType.STRING)
    private RendaFamiliar rendaFamiliar;
    @OneToMany(cascade = {CascadeType.ALL})
    private List<Anexo> anexos;
    /**
     * Campos para receber do app
     */
    @Transient
    private String estadoCivilMobile;
    @Transient
    private String conjugeMobile;
    @Transient
    private String cpfConjuge;
    @Transient
    private String rgConjuge;
    @Transient
    private String profissaoConjuge;
    /**
     * true = proprietario imovel false = inquilino do imovel
     */
    @Transient
    private boolean proprietario;

    public Proprietario() {
        this.tipoDocumento = TipoDocumento.CPF;
    }

    public String getConjugeMobile() {
        return conjugeMobile;
    }

    public void setConjugeMobile(String conjugeMobile) {
        this.conjugeMobile = conjugeMobile;
    }

    public String getCpfConjuge() {
        return cpfConjuge;
    }

    public void setCpfConjuge(String cpfConjuge) {
        this.cpfConjuge = cpfConjuge;
    }

    public String getEstadoCivilMobile() {
        return estadoCivilMobile;
    }

    public void setEstadoCivilMobile(String estadoCivilMobile) {
        this.estadoCivilMobile = estadoCivilMobile;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Date getDataNasc() {
        return dataNasc;
    }

    public void setDataNasc(Date dataNasc) {
        this.dataNasc = dataNasc;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getOrgaoEmissor() {
        return orgaoEmissor;
    }

    public void setOrgaoEmissor(String orgaoEmissor) {
        this.orgaoEmissor = orgaoEmissor;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getLocalTrabalho() {
        return localTrabalho;
    }

    public void setLocalTrabalho(String localTrabalho) {
        this.localTrabalho = localTrabalho;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public EstadoCivil getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(EstadoCivil estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public Proprietario getConjuge() {
        return conjuge;
    }

    public void setConjuge(Proprietario conjuge) {
        this.conjuge = conjuge;
    }

    public String getTempoMoradia() {
        return tempoMoradia;
    }

    public void setTempoMoradia(String tempoMoradia) {
        this.tempoMoradia = tempoMoradia;
    }

    public String getTempoMoradiaMunicipio() {
        return tempoMoradiaMunicipio;
    }

    public void setTempoMoradiaMunicipio(String tempoMoradiaMunicipio) {
        this.tempoMoradiaMunicipio = tempoMoradiaMunicipio;
    }

    public Boolean getBolsaFamilia() {
        return bolsaFamilia;
    }

    public void setBolsaFamilia(Boolean bolsaFamilia) {
        this.bolsaFamilia = bolsaFamilia;
    }

    public Double getValorBolsaFamilia() {
        return valorBolsaFamilia;
    }

    public void setValorBolsaFamilia(Double valorBolsaFamilia) {
        this.valorBolsaFamilia = valorBolsaFamilia;
    }

    public Boolean getMinhaCasaMinhaVida() {
        return minhaCasaMinhaVida;
    }

    public void setMinhaCasaMinhaVida(Boolean minhaCasaMinhaVida) {
        this.minhaCasaMinhaVida = minhaCasaMinhaVida;
    }

    public ComposicaoFamiliar getComposicaoFamiliar() {
        return composicaoFamiliar;
    }

    public void setComposicaoFamiliar(ComposicaoFamiliar composicaoFamiliar) {
        this.composicaoFamiliar = composicaoFamiliar;
    }

    public RendaFamiliar getRendaFamiliar() {
        return rendaFamiliar;
    }

    public void setRendaFamiliar(RendaFamiliar rendaFamiliar) {
        this.rendaFamiliar = rendaFamiliar;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }

    public String getRgConjuge() {
        return rgConjuge;
    }

    public void setRgConjuge(String rgConjuge) {
        this.rgConjuge = rgConjuge;
    }

    public String getProfissaoConjuge() {
        return profissaoConjuge;
    }

    public void setProfissaoConjuge(String profissaoConjuge) {
        this.profissaoConjuge = profissaoConjuge;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 71 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 71 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 71 * hash + (this.cnpj != null ? this.cnpj.hashCode() : 0);
        hash = 71 * hash + (this.nomeFantasia != null ? this.nomeFantasia.hashCode() : 0);
        hash = 71 * hash + (this.dataNasc != null ? this.dataNasc.hashCode() : 0);
        hash = 71 * hash + (this.tipoDocumento != null ? this.tipoDocumento.hashCode() : 0);
        hash = 71 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 71 * hash + (this.orgaoEmissor != null ? this.orgaoEmissor.hashCode() : 0);
        hash = 71 * hash + (this.profissao != null ? this.profissao.hashCode() : 0);
        hash = 71 * hash + (this.localTrabalho != null ? this.localTrabalho.hashCode() : 0);
        hash = 71 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        hash = 71 * hash + (this.estadoCivil != null ? this.estadoCivil.hashCode() : 0);
        hash = 71 * hash + (this.telefone != null ? this.telefone.hashCode() : 0);
        hash = 71 * hash + (this.tempoMoradia != null ? this.tempoMoradia.hashCode() : 0);
        hash = 71 * hash + (this.tempoMoradiaMunicipio != null ? this.tempoMoradiaMunicipio.hashCode() : 0);
        hash = 71 * hash + (this.bolsaFamilia != null ? this.bolsaFamilia.hashCode() : 0);
        hash = 71 * hash + (this.valorBolsaFamilia != null ? this.valorBolsaFamilia.hashCode() : 0);
        hash = 71 * hash + (this.minhaCasaMinhaVida != null ? this.minhaCasaMinhaVida.hashCode() : 0);
        hash = 71 * hash + (this.composicaoFamiliar != null ? this.composicaoFamiliar.hashCode() : 0);
        hash = 71 * hash + (this.rendaFamiliar != null ? this.rendaFamiliar.hashCode() : 0);
        hash = 71 * hash + (this.anexos != null ? this.anexos.hashCode() : 0);
        hash = 71 * hash + (this.estadoCivilMobile != null ? this.estadoCivilMobile.hashCode() : 0);
        hash = 71 * hash + (this.conjugeMobile != null ? this.conjugeMobile.hashCode() : 0);
        hash = 71 * hash + (this.cpfConjuge != null ? this.cpfConjuge.hashCode() : 0);
        hash = 71 * hash + (this.proprietario ? 1 : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Proprietario other = (Proprietario) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if ((this.cnpj == null) ? (other.cnpj != null) : !this.cnpj.equals(other.cnpj)) {
            return false;
        }
        if ((this.nomeFantasia == null) ? (other.nomeFantasia != null) : !this.nomeFantasia.equals(other.nomeFantasia)) {
            return false;
        }
        if (this.dataNasc != other.dataNasc && (this.dataNasc == null || !this.dataNasc.equals(other.dataNasc))) {
            return false;
        }
        if (this.tipoDocumento != other.tipoDocumento) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.orgaoEmissor == null) ? (other.orgaoEmissor != null) : !this.orgaoEmissor.equals(other.orgaoEmissor)) {
            return false;
        }
        if ((this.profissao == null) ? (other.profissao != null) : !this.profissao.equals(other.profissao)) {
            return false;
        }
        if ((this.localTrabalho == null) ? (other.localTrabalho != null) : !this.localTrabalho.equals(other.localTrabalho)) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
        if (this.estadoCivil != other.estadoCivil) {
            return false;
        }
        if ((this.telefone == null) ? (other.telefone != null) : !this.telefone.equals(other.telefone)) {
            return false;
        }
        if ((this.conjuge != other.conjuge && (this.conjuge == null || !this.conjuge.equals(other.conjuge)))
                || (this.conjuge != null && other.conjuge != null && this.conjuge.getId() != other.conjuge.getId())) {
            return false;
        }
        if ((this.tempoMoradia == null) ? (other.tempoMoradia != null) : !this.tempoMoradia.equals(other.tempoMoradia)) {
            return false;
        }
        if ((this.tempoMoradiaMunicipio == null) ? (other.tempoMoradiaMunicipio != null) : !this.tempoMoradiaMunicipio.equals(other.tempoMoradiaMunicipio)) {
            return false;
        }
        if (this.bolsaFamilia != other.bolsaFamilia && (this.bolsaFamilia == null || !this.bolsaFamilia.equals(other.bolsaFamilia))) {
            return false;
        }
        if (this.valorBolsaFamilia != other.valorBolsaFamilia && (this.valorBolsaFamilia == null || !this.valorBolsaFamilia.equals(other.valorBolsaFamilia))) {
            return false;
        }
        if (this.minhaCasaMinhaVida != other.minhaCasaMinhaVida && (this.minhaCasaMinhaVida == null || !this.minhaCasaMinhaVida.equals(other.minhaCasaMinhaVida))) {
            return false;
        }
        if (this.composicaoFamiliar != other.composicaoFamiliar) {
            return false;
        }
        if (this.rendaFamiliar != other.rendaFamiliar) {
            return false;
        }
        if (this.anexos != other.anexos && (this.anexos == null || !this.anexos.equals(other.anexos))) {
            return false;
        }
        if ((this.estadoCivilMobile == null) ? (other.estadoCivilMobile != null) : !this.estadoCivilMobile.equals(other.estadoCivilMobile)) {
            return false;
        }
        if ((this.conjugeMobile == null) ? (other.conjugeMobile != null) : !this.conjugeMobile.equals(other.conjugeMobile)) {
            return false;
        }
        if ((this.cpfConjuge == null) ? (other.cpfConjuge != null) : !this.cpfConjuge.equals(other.cpfConjuge)) {
            return false;
        }
        if (this.proprietario != other.proprietario) {
            return false;
        }
        return true;
    }

    @Override
    // Nunca mexer no To String pois está sendo usado no relatório do memorial descritivo
    public String toString() {
        return nome;
    }

    public String formatedDocument() {
        MaskFormatter mask;
        String tipo;

        if ((this.cpf == null || this.cpf.isEmpty()) && (this.cnpj == null || this.cnpj.isEmpty())) {
            return "";
        }

        if (this.tipoDocumento != null) {
            tipo = this.tipoDocumento.equals(TipoDocumento.CNPJ) ? "CNPJ: " : "CPF: ";
        } else {
            if (this.nome != null && !this.nome.equals("")) {
                tipo = "CPF: ";
            } else {
                tipo = "CNPJ: ";
            }
        }

        try {
            String format, value;
            if (this.tipoDocumento != null) {
                if (this.tipoDocumento.equals(TipoDocumento.CPF)) {
                    format = "###.###.###-##";
                    value = this.getCpf();
                } else {
                    format = "##.###.###/####-##";
                    value = this.getCnpj();
                }
            } else {
                if (this.nome != null && !this.nome.equals("")) {
                    format = "###.###.###-##";
                    value = this.getCpf();
                } else {
                    format = "##.###.###/####-##";
                    value = this.getCnpj();
                }
            }

            mask = new MaskFormatter(format);
            mask.setValueContainsLiteralCharacters(false);
            return tipo + mask.valueToString(value);
        } catch (ParseException e) {
            System.err.println(e);
        }
        return "";
    }

    public boolean isProprietario() {
        return proprietario;
    }

    public void setProprietario(boolean proprietario) {
        this.proprietario = proprietario;
    }

    public Proprietario getClone() {
        try {
            return (Proprietario) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(" Cloning not allowed. ");
            return this;
        }
    }
}
